package com.jpatest.dao;

import com.jpatest.entity.PetEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.util.List;

/**
 * @author Tu
 * @date 2022/2/24 9:39
 * <p>
 * JpaRepository<></>
 * 第一个参数指定实体类，第二个是主键ID的类型（包装类）
 */
public interface PetDao extends JpaRepository<PetEntity, Integer> {

    /**
     * 根据名称查询
     *
     * @param pName 宠物名
     * @return 宠物集合
     */
    List<PetEntity> findByName(String pName);

    /**
     * 根据颜色查询
     *
     * @param color 颜色
     * @return 宠物集合
     */
    List<PetEntity> findByColor(String color);

    /**
     * 根据名称颜色查询
     * 注意：方法名不能乱写，根据sql语句写
     *
     * @param name  宠物名
     * @param color 颜色
     * @return
     */
    List<PetEntity> findByNameAndColor(String name, String color);


    /**
     * * jpql查询所有
     * * sql: select * from t_pet
     * * jpql:
     * from com.changhui.eo.PetEntity
     * select pet from com.changhui.eo.PetEntity pet
     *
     * @return
     */
    @Query(value = "select pet from com.jpatest.entity.PetEntity pet")
    List<PetEntity> selectPetAll();


    /**
     * 注意：查列返回封装Object[]数组，用实体接收会转换异常
     * select id,name,color from com.changhui.eo.PetEntity
     *
     * @return
     */
    @Query(value = "select id,name,color from com.jpatest.entity.PetEntity")
    List<Object[]> selectAllColumnList();

    /**
     * 查询列且返回实体类接收
     * new 对象，使用实体类的参数构造器
     *
     * @return
     */
    @Query(value = "select new com.jpatest.entity.PetEntity(id,name,color) from com.jpatest.entity.PetEntity ")
    List<PetEntity> selectAllPetListForColumn();

    /**
     * 使用jpql顺序查询，根据名称查询
     *
     * @param name 名称
     * @return
     */
    @Query(value = "from com.jpatest.entity.PetEntity where name =?1")
    List<PetEntity> selectPetByName(String name);

    /**
     * 使用jpql具名查询，根据颜色查询
     *
     * @param color 颜色
     * @return
     */
    @Query(value = "from com.jpatest.entity.PetEntity where color = :color")
    List<PetEntity> selectPetByColor(@Param("color") String color);

    /**
     * 使用原生sql查询
     * 添加 nativeQuery = true，即代表使用原生sql，不再使用类，使用数据库
     *
     * @param color 颜色
     * @return
     */
    @Query(value = "SELECT * FROM pet WHERE p_color = :color", nativeQuery = true)
    List<PetEntity> selectPetByColorForTable(@Param("color") String color);

}
